package com.loto.model;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;

import javax.swing.table.AbstractTableModel;




public class CombinaisonModele extends AbstractTableModel {
	public String message="";

	/**
	 * 
	 */
	private static final long serialVersionUID = 1098440790801751291L;
	
	
	private CombinaisonService combinaisonService;
	private final String[] entetes = {
			"Annee numero tirage", "jour tirage", "Date tirage", "Combinaison gagnante",
			"Nombre de gagnant au rang 1","Nombre de gagnant au rang 2","Nombre de gagnant au rang 3",
			"Numero joker Plus", "Devise"};	
	private List<Combinaison> combinaisons;
	
	public CombinaisonModele() throws IOException {
		super();
		combinaisonService = CombinaisonService.getInstance();
		combinaisons = combinaisonService.findLastCombinaisons();
	}
	
	public CombinaisonModele(List<Combinaison> combinaisons) throws IOException {
		super();
		this.combinaisons=combinaisons;
	}
	
	public int getColumnCount() {
		// TODO Auto-generated method stub
		return entetes.length;
	}

	@Override
	public String getColumnName(int columnIndex) {
		return entetes[columnIndex];
	}
	
	public int getRowCount() {
		// TODO Auto-generated method stub
		return combinaisons.size();
	}

	public Object getValueAt(int rowIndex, int columnIndex) {
		// TODO Auto-generated method stub
		switch (columnIndex) {

		case 0:
			return combinaisons.get(rowIndex).getAnneeNumeroTirage();
		case 1:
			return combinaisons.get(rowIndex).getJourTirage();
		case 2:
			return combinaisons.get(rowIndex).getDateTirage();
		case 3:
			return combinaisons.get(rowIndex).getCombinaisonGagnante();
		case 4:
			return combinaisons.get(rowIndex).getNbGagnantRang1();
		case 5:
			return combinaisons.get(rowIndex).getNbGagnantRang2();
		case 6:
			return combinaisons.get(rowIndex).getNbGagnantRang3();
		case 7:
			return combinaisons.get(rowIndex).getNumJokerPlus();
		case 8:
			return combinaisons.get(rowIndex).getDevise();
		
		default:
			throw new IllegalArgumentException();
		}
	}
	
	public List<Combinaison> getCombinaison() {
		return combinaisons;
	}
	
	/**
	 * 
	 * @param date1
	 * @param date2
	 * @return liste des résultats pour une recherche entre 2 dates
	 */
	public List<Combinaison> getCombinaisonByDate(String date1,String date2) {
		List<Combinaison> combinaisons = new ArrayList<Combinaison>();
		List<String> dates = new ArrayList<String>();
		boolean fini=false;
		int i = 0;
		
		//On teste le bon format de la date
		String[] d1 = date1.split("/");
		String[] d2 = date1.split("/");

		if(d1.length==3 || d2.length==3){
		GregorianCalendar gc = new GregorianCalendar(Integer.parseInt(d1[0]), Integer.parseInt(d1[1]), Integer.parseInt(d1[2])); 
		gc.setLenient(false);
		gc = new GregorianCalendar(Integer.parseInt(d2[0]), Integer.parseInt(d2[1]), Integer.parseInt(d2[2]));
		gc.setLenient(false);
		}
		else { 
			message="Mauvais format. Réessayez au format AAAA/MM/JJ"; 
			return null; 
		}
		
		while(!fini) {
			Date utilDate=null;
		    String d="";
			SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
			try {
				utilDate = formatter.parse(date1);
				if(utilDate.after(formatter.parse(date2))) {
					message="Votre date de début est antérieur à votre date de fin";
					return null;
				}

			} catch (ParseException e) {
				e.printStackTrace();
			}
			Calendar cal = Calendar.getInstance();
			cal.setTime(utilDate);
			cal.add(Calendar.DAY_OF_MONTH, i);
			utilDate=cal.getTime();
			d=new SimpleDateFormat("yyyy/MM/dd").format(utilDate);
			dates.add(d);
			i++;
			if(d.equals(date2)) fini=true;
		}

		for (i = 0; i < this.combinaisons.size(); i++) {
			for (Iterator<String> it = dates.iterator(); it.hasNext();) {
				String date = (String) it.next();
				
				if(this.combinaisons.get(i).getDateTirage().equals(date)) {
					combinaisons.add(this.combinaisons.get(i));
					System.out.println("combinaisonModele"+this.combinaisons.get(i).getDateTirage());
				}
			}
		}
		
		return combinaisons;
		
	}
	
	/**
	 * 
	 * @param date
	 * @return liste des résultats pour une recherche sur une date
	 */
	public List<Combinaison> getCombinaisonByDate(String date) {

		List<Combinaison> combinaisons = new ArrayList<Combinaison>();
		
			String[] d = date.split("/");
			if(d.length==3){
			GregorianCalendar gc = new GregorianCalendar(Integer.parseInt(d[0]), Integer.parseInt(d[1]), Integer.parseInt(d[2])); 
			gc.setLenient(false);
			}
			else { 
				message="Mauvais format. Réessayez au format AAAA/MM/JJ"; 
				return null; 
			}
		
		
		for (int i = 0; i < this.combinaisons.size(); i++) {
			if(this.combinaisons.get(i).getDateTirage().equals(date)) {
				combinaisons.add(this.combinaisons.get(i));
			}
		}
		return combinaisons;
		
	}
	
	public boolean getcombinaisonexist(String combinaison){
		Iterator i = this.combinaisons.iterator();
		Combinaison  combitmp;
		boolean trouve = false;
		while(i.hasNext() && !trouve){
			combitmp = (Combinaison)i.next();
			if(combitmp.getCombinaisonGagnante().trim().equalsIgnoreCase(combinaison.trim())){
				trouve = true;
			}
		}
		
		return trouve;
	}

}
